package com.cskaoyan.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

/**
 * @author stone
 * @date 2022/06/17 15:54
 */
@Component
public class CustomAspect {

    // 切面组件中的方法，作为对应的通知方法 → 在对应的时间点下会执行到对应的方法

    public void beforex() {
        System.out.println("before方法");
    }

    public void after() {
        System.out.println("after通知方法");
    }

    // Around通知 → 最强通知 ：返回值为Object，要有委托类方法的执行
    // 类似于InvocationHandler的invoke，类似于MethodInterceptor的invoke
    // 执行委托类的方法：ProceedingJoinPoint proceed方法

    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("开始时间：" + start);

        Object proceed = joinPoint.proceed(); // 执行委托类的方法

        long end = System.currentTimeMillis();
        System.out.println("方法执行时间：" + (end - start));
        return proceed; // 就是作为代理对象执行方法的返回值
    }

    // afterReturning通知方法的形参，采用Object类型，接收委托类方法的返回值
    public void afterReturning(Object result) {
        System.out.println("AfterReturning接收到的结果：" + result);
    }

    // public void afterThrowing(Exception exception) {
    public void afterThrowing(Throwable exception) {
        System.out.println("afterThrowing通知：" + exception.getMessage());
    }
}
